package com.leetcode;

import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 349. 两个数组的交集
 * 使用stream流 + distinct
 *
 * @author fy
 * @date 2022/4/6 9:41
 */
public class Solution349_3 {

    public int[] intersection(int[] nums1, int[] nums2) {
        return Arrays.stream(nums1)
                .filter(item -> Arrays.stream(nums2)
                        .filter(num -> item == num)
                        .findAny()
                        .isPresent())
                .boxed()
                .collect(Collectors.toSet())
                .stream()
                .mapToInt(item -> item)
                .toArray();
    }

    /**
     * distinct简化
     *
     * @param nums1
     * @param nums2
     * @return
     */
    public int[] intersection1(int[] nums1, int[] nums2) {
        return Arrays.stream(nums1)
                .distinct()
                .filter(item -> Arrays.stream(nums2)
                        .filter(num -> item == num)
                        .findAny()
                        .isPresent())
                .toArray();
    }

    /**
     * 先将一个数组转换为Set
     * 简化nums2流的反复创建操作
     *
     * @param nums1
     * @param nums2
     * @return
     */
    public int[] intersection2(int[] nums1, int[] nums2) {
        Set<Integer> set1 = Arrays.stream(nums1).boxed().collect(Collectors.toSet());
        return Arrays.stream(nums2)
                .distinct()
                .filter(set1::contains)
                .toArray();
    }

}
